package modelo.entidad;

import java.util.ArrayList;
import java.util.List;
import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.FetchType;
import javax.persistence.GenerationType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

import modelo.hibernate.dao.DaoAnuncio;
import modelo.hibernate.dao.DaoSugerencia;

import org.hibernate.annotations.IndexColumn;
import org.zkoss.zul.ListModel;
import org.zkoss.zul.ListModelList;

@Entity
@Table(name="usuario",schema="public")
@PrimaryKeyJoinColumn(name="id")


public class Usuario implements Serializable {
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;

	@Column(name="cedula")
	private String cedula;
	@Column(name="nombre")
	private String nombre;
	@Column(name="apellido")
	private String apellido;
	@Column(name="telefono")
	private String telefono;
	@Column(name="email")
	private String email;
	@Column(name="direccion")
	private String direccion;
	
	@Column(name="login")
	private String login;
	@Column(name="password")
	private String password;
	@Column(name="tipousuario")
	private String tipoUsuario;
	@Column(name="estatus")
	private String estatus;		
	
	@OneToMany(cascade= CascadeType.ALL )
    @JoinColumn(name="id_usuario") 
	private List<Sugerencia> sugerencias = new ArrayList<Sugerencia>();
    
    @OneToMany(cascade= CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="id_usuario") 
	private List<Anuncio> publicaciones = new ArrayList<Anuncio>();

    @Transient
	private boolean editingStatus = false;
//Constructores	
	
	
	public Usuario() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	/*
	public Usuario(int id,  String cedula, String nombre,
			String apellido, String telefono, String email, String direccion,
			String login, String password, int tipoUsuario, String estatus,
			List<Sugerencia> sugerencias, List<Anuncio> publicaciones) {
		super();
		this.id = id;
		this.cedula = cedula;
		this.nombre = nombre;
		this.apellido = apellido;
		this.telefono = telefono;
		this.email = email;
		this.direccion = direccion;
		this.login = login;
		this.password = password;
		this.tipoUsuario = tipoUsuario;
		this.estatus = estatus;
		this.sugerencias = sugerencias;
		this.publicaciones = publicaciones;
	}
*/

	public Usuario(String cedula, String nombre,
			String apellido, String telefono, String email, String direccion,
			String login, String password, String tipoUsuario, String estatus) {
		super();
		this.cedula = cedula;
		this.nombre = nombre;
		this.apellido = apellido;
		this.telefono = telefono;
		this.email = email;
		this.direccion = direccion;
		this.login = login;
		this.password = password;
		this.tipoUsuario = tipoUsuario;
		this.estatus = estatus;
	    //this.sugerencias = sugerencias;
		//this.publicaciones = publicaciones;
	}


//Setter y Getters	
	
	
	public int getId() {
		return id;
	}


	public void setId(int id) {
		this.id = id;
	}


	public String getCedula() {
		return cedula;
	}
	public void setCedula(String cedula) {
		this.cedula = cedula;
	}
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getApellido() {
		return apellido;
	}
	public void setApellido(String apellido) {
		this.apellido = apellido;
	}
	public String getTelefono() {
		return telefono;
	}
	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getDireccion() {
		return direccion;
	}
	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getTipoUsuario() {
		return tipoUsuario;
	}
	public void setTipoUsuario(String tipoUsuario) {
		this.tipoUsuario = tipoUsuario;
	}
	public String getEstatus() {
		return estatus;
	}
	public void setEstatus(String estatus) {
		this.estatus = estatus;
	}
	public List<Sugerencia> getSugerencias() {
		return sugerencias;
	}
	public void setSugerencias(List<Sugerencia> sugerencias) {
		this.sugerencias = sugerencias;
	}
	
	public List<Anuncio> getPublicaciones() {
		return publicaciones;
	}
	
	public void setPublicaciones(List<Anuncio> publicaciones) {
		this.publicaciones = publicaciones;
	}
	
	public void setPublicacion(int id, Anuncio a)
	{
		this.publicaciones.set(id, a);
	}
	
//Metodos 
	
	public ListModel<Sugerencia> getItemsSugerencias() {
 		DaoSugerencia daoSugerencias =new DaoSugerencia();	
		List<Sugerencia> listaSugerencia=null;
		try {
			listaSugerencia = daoSugerencias.obtenerSugerenciasUsuarios(this);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return new ListModelList<Sugerencia>(listaSugerencia);
	}
	
	public ListModel<Anuncio> getItemsAnuncios() {
 		DaoAnuncio daoAnuncios =new DaoAnuncio();	
		List<Anuncio> listaAnuncio=null;
		try {
			listaAnuncio = daoAnuncios.obtenerAnunciosbyUsuario(this);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return new ListModelList<Anuncio>(listaAnuncio);
	}
	
	public int Buscar(List<Anuncio> publicaciones,int id)
	{
	    for(int i=0; i<publicaciones.size();i++)
		{
			if(publicaciones.get(i).getId()==id)
				return i;
		}
		return -1; 
	}
	
	public boolean getEditingStatus() {
		return editingStatus;
	}

	public void setEditingStatus(boolean editingStatus) {
		this.editingStatus = editingStatus;
	}
}
